#include <iostream>
#include <string>

using namespace std;

/*
虚函数
    基类中的成员函数 加了 virtual 标识符 表示这个成员函数已经成为了虚函数

    此时 子类是可以重写父亲的虚函数

什么是重写
    当父类中有虚函数
    子类可以对这个虚函数进行重写
        重写 就是用 虚函数 的 返回值 函数名 参数列表 这些信息 重新在子类中编写了一个成员函数

    此时子类的重写函数就会覆盖基类

纯虚函数 在虚函数后面加了一个 = 0
    格式 virtual void Moto_start() = 0;
        纯虚函数 只能被声明 要使用纯虚函数必须要重写

抽象类：当我们的类中，有一个纯虚函数之后，那么现在这个类也就被称为了抽象类

特点：
    1.抽象类无法实例化对象
    2.抽象类的子类必须重写抽象类的纯虚函数，否则也属于抽象类
    3.在函数的形参中，还可以用 抽象类作为 引用参数
*/

class Motor_Ctrl
{
private:
    /* data */
public:
    //电机启动函数
    //虚函数：可以被重写
    virtual void Moto_start() = 0;

    //电机停止函数
    virtual void Moto_stop() = 0;//虚函数
    
};

class Motor_x : public Motor_Ctrl
{
private:
    /* data */
public:
    //电机启动函数
     void Moto_start ()
     {
        cout << "派生类x电机启动" << endl;
     }
     //电机停止函数
     void Moto_stop ()
     {
        cout << "派生类x电机停止" << endl;
     }
};

class Motor_y : public Motor_Ctrl
{
private:
    /* data */
public:
    //电机启动函数
     void Moto_start ()
     {
        cout << "派生类y电机启动" << endl;
     }
     //电机停止函数
     void Moto_stop ()
     {
        cout << "派生类y电机停止" << endl;
     }
};



/*
父类可以作为子类的类型
子类不能作为父类的类型
*/
void Motor_func(Motor_Ctrl & M)
{
    M.Moto_start();
    M.Moto_stop();
}

int main(int argc, char const *argv[])
{
    //Motor_x M;
    Motor_y M;
    Motor_func(M);
    
    
    return 0;
}
